/**
 * 图片数据缓存
 *
 * @author Richard
 */

class DataStorage {
    /**
     * 初始化方法，在页面的onLoad 方法中调用
     * @param  {Object}     pageContext     传入的对象
     * @param  {Function}   defaultCallback 默认回调
     */
    constructor(pageContext, defaultCallback) {
        this.app = pageContext //小程序或者页面对象
        this.defaultCallback = defaultCallback || function() {}
        this.callbacks = {}
        this.storageInfo = {} //本地缓存信息
        this.dataStorage = {
                imagesObj: {},
                audiosObj: {},
                videosObj: {},

            } //缓存数据对象
        this.app.globalData.dataStorage = {} //全局暴露的缓存数据
        this.init = this._init(); //对象初始化
    }

    /**
     * 初始化
     */
    _init() {
        var _this = this;

        this._getStorage('dataStorage')
            .then((res) => {
                _this.dataStorage = res.data;
                _this._pushDataToGlobal(res.data);
            })
        this._getStorageInfo(); //获取本地缓存信息
    }

    /**
     * 下载文件
     *
     * @param  {String}     src         图片地址
     * @param  {Function}   cb          加载完成后的回调（可选）
     */
    _downLoadFile(src, cb) {
        var _this = this;

        if (src.constructor.name == "Array") {
            // var imagesObj = {};
            src.forEach(url => { //下载每张图片后以图片名和地址存入图片对象
                // console.log('url', url);
                let filePath = url.split('/').pop().split('.');
                console.log('filePath', filePath)
                let fileName = filePath[0];
                let fileType = filePath[1];

                loadFile(url)
                    .then((tempFilePath) => {
                        return _this._saveFile(tempFilePath);
                    })
                    .then((LocalFilePath) => {
                        switch (fileType) {
                            case 'jpg' || 'png':
                                _this.dataStorage.imagesObj[fileName + '_' + fileType] = LocalFilePath;
                                break;
                            case 'mp3':
                                _this.dataStorage.audiosObj[fileName + '_' + fileType] = LocalFilePath;
                                break;
                            case 'mp4':
                                _this.dataStorage.videosObj[fileName + '_' + fileType] = LocalFilePath;
                                break;
                            default:
                                break;
                        }
                    })
                    .then(() => {
                        this._setStorage('dataStorage', this.dataStorage);
                        this._pushDataToGlobal(this.dataStorage);
                    })
            });

            // this.dataStorage['imagesObj'] = imagesObj; //图片对象存入数据缓存对象
            // this._setStorage('dataStorage', this.dataStorage) //将数据缓存对象写入本地缓存
            console.log('dataStorage', this.dataStorage);
        }

        function loadFile(url, cb) { //下载资源

            let P = new Promise(function(resolve, reject) {
                //做一些异步操作
                wx.downloadFile({
                    url: url,
                    success: function(res) {
                        var tempFilePath = res.tempFilePath;
                        resolve(tempFilePath);
                    },
                    fail: function(err) {
                        reject(err);
                    }
                })
            });
            return P;

        }
    }

    /**
     * 保存文件到本地
     * @param  {String}   FilePath      临时文件地址
     */
    _saveFile(FilePath, cb) {

        let P = new Promise(function(resolve, reject) {
            //做一些异步操作
            wx.saveFile({
                tempFilePath: FilePath,
                success: function(res) {
                    let LocalFilePath = res.savedFilePath;
                    resolve(LocalFilePath);
                },
                fail: function(err) {
                    reject(err);
                }
            })
        });
        return P;

    }

    /**
     * 数据写入缓存
     * @param  {String}         key     本地缓存中的指定的 key
     * @param  {Object/String}  data    需要存储的内容 
     */
    _setStorage(key, data, cb) {
        var _this = this;

        let P = new Promise(function(resolve, reject) {
            wx.setStorage({
                key: key || 'dataStorage',
                data: data || _this.dataStorage,
                success: function(res) {
                    console.log('缓存数据成功');
                    resolve(res)
                },
                fail: function(err) {
                    reject(err)
                }
            })
        })
        return P;

    }

    /**
     * 读取缓存中的数据
     * @param  {String}         key     本地缓存中的指定的 key
     */
    _getStorage(key, cb) {
        var _this = this;

        let P = new Promise(function(resolve, reject) {
            wx.getStorage({
                key: key || 'dataStorage',
                success: function(res) {
                    _this.dataStorage = res.data;
                    resolve(res)
                },
                fail: function(err) {
                    reject(err)
                }
            })
        })
        return P;
    }

    /**
     * 推送缓存数据到全局
     * 
     */
    _pushDataToGlobal(data) {
        var _this = this;

        _this.app.globalData.dataStorage = data;
    }

    /**
     * 获取本地缓存信息
     */
    _getStorageInfo() {
        var _this = this;

        let P = new Promise(function(resolve, reject) {
            wx.getStorageInfo({
                success: function(res) {
                    console.log('本地缓存信息', res);
                    _this.storageInfo = {
                        keys: res.keys,
                        currentSize: res.currentSize,
                        limitSize: res.limitSize
                    }
                    resolve(res);
                },
                fail: function(err) {
                    reject(err);
                }
            })
        })
        return P;
    }

    //执行回调
    _runCallback(err, data) {
        let callback = this.callbacks || this.defaultCallback
        callback(err, data)
    }

}

module.exports = DataStorage